import tarfile
import zipfile
from pathlib import Path

import rarfile


def extract_archive(file_path: Path, extract_dir: Path):
    if file_path.suffix == ".zip":
        # 显式指定中文编码（GBK/CP936），兼容 Windows 生成的 ZIP
        with zipfile.ZipFile(file_path, "r") as zip_ref:
            for file_info in zip_ref.infolist():
                # 尝试修复文件名编码
                try:
                    # 先尝试 UTF-8 解码
                    file_name = file_info.filename.encode('cp437').decode('utf-8')
                except (UnicodeDecodeError, UnicodeEncodeError):
                    try:
                        # 再尝试 GBK 解码
                        file_name = file_info.filename.encode('cp437').decode('gbk')
                    except (UnicodeDecodeError, UnicodeEncodeError):
                        # 如果 cp437 编码失败，直接尝试 UTF-8 解码
                        try:
                            file_name = file_info.filename.encode('latin1').decode('utf-8')
                        except (UnicodeDecodeError, UnicodeEncodeError):
                            # 最终回退到原始名称
                            file_name = file_info.filename
                # 重设正确文件名
                file_info.filename = file_name
                # 解压单个文件
                zip_ref.extract(file_info, extract_dir)

    elif file_path.suffix == ".rar":
        # RAR 文件处理（rarfile 库默认处理编码问题）
        with rarfile.RarFile(file_path, "r") as rar_ref:
            rar_ref.extractall(extract_dir)

    elif file_path.suffix in [".tar", ".gz", ".bz2"]:
        # tar 文件通常使用 UTF-8
        with tarfile.open(file_path, "r:*") as tar_ref:
            tar_ref.extractall(extract_dir)
